package com.fenghao.subject.application.controller;

import com.alibaba.fastjson.JSON;
import com.fenghao.subject.application.convert.SubjectLabelDtoConvert;
import com.fenghao.subject.application.dto.SubjectLabelDTO;
import com.fenghao.subject.common.entity.Result;
import com.fenghao.subject.domain.entity.SubjectLabelBO;
import com.fenghao.subject.domain.service.SubjectLabelDomainService;
import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * SubjectLabel ：题目标签相关！！！
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/subject/label")
public class SubjectLabelController {

    private final SubjectLabelDomainService subjectLabelDomainService;


    /**
     * 新增标签
     */
    @PostMapping("/add")
    public Result<String> addSubjectLabel(@RequestBody SubjectLabelDTO subjectLabelDTO) {

        try {
            if (log.isInfoEnabled()) {
                log.info("校验入参 SubjectLabelDTO :{}", JSON.toJSONString(subjectLabelDTO));
            }
            SubjectLabelBO subjectLabelBo = SubjectLabelDtoConvert.INSTANCE.convertDtoToBo(subjectLabelDTO);
            if (log.isInfoEnabled()) {
                log.info("校验入参 SubjectLabelDTO 转换 SubjectLabelBo:{}", JSON.toJSONString(subjectLabelBo));
            }
            Boolean addSuccess = subjectLabelDomainService.addSubjectLabel(subjectLabelBo);
            return Result.ok(addSuccess);
        } catch (Exception e) {
            if (log.isInfoEnabled()) {
                log.info("校验入参 SubjectLabelDTO :{}", JSON.toJSONString(subjectLabelDTO));
            }
            return Result.fail("添加失败");
        }
    }

    /**
     * 删除标签
     */
    @PutMapping("/delete")
    public Result<String> deleteSubjectLabel(@RequestBody SubjectLabelDTO subjectLabelDTO) {
        if (log.isInfoEnabled()) {
            log.info("校验入参 SubjectLabelDTO :{}", JSON.toJSONString(subjectLabelDTO));
        }
        SubjectLabelBO subjectLabelBo = SubjectLabelDtoConvert.INSTANCE.convertDtoToBo(subjectLabelDTO);
        if (log.isInfoEnabled()) {
            log.info("校验入参 SubjectLabelDTO 转换 SubjectLabelBo:{}", JSON.toJSONString(subjectLabelBo));
        }
        Boolean deleteSuccess = subjectLabelDomainService.deleteSubjectLabel(subjectLabelBo);
        if (deleteSuccess) {
            return Result.ok("删除标签成功");
        }
        return Result.fail("删除标签失败");
    }

    /**
     * 更新标签
     */
    @PutMapping("/update")
    public Result<Boolean> updateSubjectLabel(@RequestBody SubjectLabelDTO subjectLabelDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("校验入参 SubjectLabelDTO :{}", JSON.toJSONString(subjectLabelDTO));
            }
            Preconditions.checkNotNull(subjectLabelDTO.getId(), "标签id不能为空");
            // DTO转BO
            SubjectLabelBO subjectLabelBo = SubjectLabelDtoConvert.INSTANCE.convertDtoToBo(subjectLabelDTO);
            // 与Domain交互
            Boolean result = subjectLabelDomainService.updateSubjectLabel(subjectLabelBo);
            return Result.ok(result);
        } catch (Exception e) {
            log.error("校验入参 SubjectLabelDTO 转换 SubjectLabelBo:{}", e.getMessage(), e);
            return Result.fail("更新标签失败");
        }
    }

    /**
     * 查询分类下标签
     */
    @GetMapping("/queryLabelByCategoryId")
    public Result<List<SubjectLabelDTO>> queryLabelByCategoryId(@RequestBody SubjectLabelDTO subjectLabelDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info(" 校验入参 queryLabelByCategoryId ：SubjectLabelDTO :{}", JSON.toJSONString(subjectLabelDTO));
            }

            Preconditions.checkNotNull(subjectLabelDTO.getCategoryId(), "分类id不能为空");

            SubjectLabelBO subjectLabelBo = SubjectLabelDtoConvert.INSTANCE.convertDtoToBo(subjectLabelDTO);

            List<SubjectLabelBO> subjectLabelBoList = subjectLabelDomainService.queryLabelCategoryByCategoryId(subjectLabelBo);

            List<SubjectLabelDTO> subjectLabelDTOList = SubjectLabelDtoConvert.INSTANCE.convertBoListToDtoList(subjectLabelBoList);
            return Result.ok(subjectLabelDTOList);
        } catch (Exception e) {
            log.error("SubjectLabelController:queryLabelByCategoryId:error:{}", e.getMessage(), e);
            return Result.fail("查询失败");
        }
    }
}
